// const RBAC = require('./rbac-a');
// const Provider = RBAC.providers.JsonProvider;// https://github.com/yanickrochon/rbac-a

const auth = require('./auth');

module.exports = function(options, app) {
  think.auth = auth; // 加载到全局实现授权检测

  return async(ctx, next) => {
    const {module, controller, action} = ctx;
    const data = {
      module: module,
      controller: controller,
      action: action,
      url: ctx.url
    };
    think.logger.debug(data);

    // const path = `/${module}/${controller}`;
    const path = `/${controller}`;

    // 非RESTful API不验证权限
    if (path.match(/^\/index/)) {
      return next();
    }
    
    
    // 只支持以下方法
    if (['get', 'post', 'delete', 'put', 'patch'].indexOf(action) === -1) {
      return ctx.fail(1000, `资源没有授权访问`, '');
    }

    // 第一次加载规则，然后缓存
    await think.auth.updateAuthRules();// 更新规则数据

    // 不验证的路由
    if (path.match(/^\/token/)) {
      // 注册登录
      return next();
    }
  
    if (path.match(/^\/config/)) {
      return next();
    }
  
    if (path.match(/^\/image/)) {
      return next();
    }
    
    // 不验证的路由
    if (path.match(/^\/user/)) {
      // 注册登录
      if (action === 'POST') {
        return next();
      }
    }

    // 后台管理的系统菜单读取
    if (path.match(/^\/menu/)) {
      return next();
    }

    if (path.match(/^\/event/)) {
      return next();
    }

    // 检测登录的用户信息
    let userInfo = {};
    try {
      const SESSION_KEY = 'userInfo';
      userInfo = await ctx.session(SESSION_KEY);
    } catch (err) {
      userInfo = {};
    }

    if (think.isEmpty(userInfo) || think.isEmpty(userInfo.username)) {
      return ctx.throw(401, `请登录以后访问。`);
    }

    // think.logger.debug(userInfo);
    // 超级管理元不检验权限
    if (userInfo.id === 1 && userInfo.username === 'admin') {
      return next();
    }

    // 检测RESTful路由
    const auth = await think.auth.checkRouterPath(userInfo.username, path, action);

    if (!auth) {
      return ctx.fail(1000, `没有授权访问”${path}“`);
    }

    return next();
  };
};
